#ifndef ARCHIVO_H_
#define ARCHIVO_H_

#include <iostream>
#include <string>
#include <fstream>
#include <list>
#include <stdio.h>
#include <stdlib.h>
#include "Almacenamiento.h"
#include "RegistroFijo.h"
#include "RegistroVariable.h"
#include "Bloque.h"

//Clase para implementar un almacenamiento en un Archivo de Disco.
class Archivo: public Almacenamiento {
public:

	Archivo();
	Archivo(std::string nombreArchivo,
			EstrategiaAlmacenamiento * eAlmacenamiento, int longBloque);

	//metodos de interfaz
	int escribir(Componente& componente, int offset);
	Componente* leer(int offset);
	void borrarComp(int offset);
	//int modificar(Componente componente, int offset);
	void imprimir();

	//metodos bajo nivel - privados?
	void* leer(int& offset, string tipo);
	int escribir(int offset, string tipo, void* valor);

	//texto
	void escribirTexto(Componente& componente);
	void modificarTexto(Componente& componente);
	void borrarTexto(Componente& componente);
	Componente* leerTexto(int numeroReg);
	void imprimirTexto() ;

	//Metadata
	Metadata* abrir(char t);
	void crearMetadata(char tipo, int tamanio, list<string> tipos,
			list<bool> claves);
	void inicializarMetadata(char tipo);

	//archivo
	void setNombreArchivo(std::string);
	void cerrar();
	int eof();
	int buscarEspacioLibre(int);
	virtual string& getNombreArch();
	int getLongBloque();
	int getOffsetComienzoDatos();
	int getcantidadBloques();
	int aumentarComponentesBloques();

private:
	//aux
	void abrirArchEspacios();
	void modificarArchEspacio(int nbloque, int tamanioreg);
	void borrarArchEspacios(int offset);
	void agregarArchEspacio(int offset_tamanio);
	fstream* getFileAux();

	//registros
	int escribirRegistro(Registro componente, int offset);
	Registro leerRegistro(int offset);
	//int modificarRegistro(Componente componente, int offset);
	void borrarRegistro(int offset);
	void imprimirRegistro();

	//bloques
	Bloque leerBloqueCompleto(int nbloque);
	void almacenarBloqueModificacion(int, Bloque&);
	void imprimirBloque();
	int escribirBloque(Bloque& componente, int nBloque);

	int buscarRegistro(Registro registro);
	fstream file;
	fstream fileaux;
	vector<int> offsetsEspLibre;
	string nombreArchivo;
	int comienzoDeDatos;
	int cantidadBloques;

};

#endif /*ARCHIVO_H_*/
